//
// Created by iti on 2023/8/1.
//

#include "usart.h"
#include "CRC16.h"
#include "Modbus.h"
#include "string.h"
#include "stdio.h"
#include "main.h"

uint8_t CRC_H;//CRC高8位
uint8_t CRC_L;//CRC低8位
//Modbus处理函数
void Modbus_Work(uint16_t len, UART_t* UART)
{
    if(UART1.pucRec_Buffer[0]==0x01)
    {
        if((crc_compute(UART1.pucRec_Buffer,len))== 0x0000)    //判断CRC校验是否正确
        {
            switch(UART1.pucRec_Buffer[1])                      //根据功能码选择服务函数
            {
                case 0x03:  //功能码03
                    Modbus_03_Solve();
                    break;

                case 0x10:  //功能码10
                    Modbus_10_Solve();
                    break;


                default:       //未定义的功能码（这里可以再改）
                    UART1.pucSend_Buffer[0]=0x03;
                    UART1.pucSend_Buffer[1]=0x80 | UART1.pucRec_Buffer[1];
                    UART1.pucSend_Buffer[2]=0X01;//数据
                    CRC_H=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0xFF00)>>8);
                    CRC_L=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0x00FF));
                    UART1.pucSend_Buffer[3]=CRC_H;
                    UART1.pucSend_Buffer[4]=CRC_L;

                // *(UART->pucSend_Buffer+3)=crc_compute(UART1.pucSend_Buffer,3);
                    Send_Data(UART1.pucSend_Buffer,5);
                    break;
            }
        }
        else     //CRC校验不正确（也可以再改）
        {
            UART1.pucSend_Buffer[0]=0x03;
            UART1.pucSend_Buffer[1]=0x80 | UART1.pucRec_Buffer[1];
            UART1.pucSend_Buffer[2]=0X04;
            CRC_H=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0xFF00)>>8);
            CRC_L=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0x00FF));
            UART1.pucSend_Buffer[3]=CRC_H;
            UART1.pucSend_Buffer[4]=CRC_L;
            //*(UART->pucSend_Buffer+3)=crc_compute(UART1.pucSend_Buffer,3);
            Send_Data(UART1.pucSend_Buffer,5);

        }
    }
    else memset(UART1.pucRec_Buffer,0,sizeof(UART1.pucRec_Buffer));     //非设备地址码，清除接收
    memset(UART1.pucSend_Buffer,0,sizeof(UART1.pucSend_Buffer));
}


//Modbus 03功能码处理函数----读多个字节
void Modbus_03_Solve(void)//读操作
{
    uint8_t t;

    if((UART1.pucRec_Buffer[2]==0x00)&&(UART1.pucRec_Buffer[3]==0x00))//寄存器起始地址为0x0000
    {
        if((UART1.pucRec_Buffer[4]==0x00)&&(UART1.pucRec_Buffer[5]<=0x22))//读取寄存器数量，不能超过34个（根据数组长度变化）
        {
            UART1.pucSend_Buffer[0]=0x01;
            UART1.pucSend_Buffer[1]=0x03;
            UART1.pucSend_Buffer[2]=UART1.pucRec_Buffer[5]*2 ;//返回字节数为寄存器数量*2（一个寄存器存2个字节）

            for(t=0; t<4; t++)
            {
              UART1.pucSend_Buffer[2 * t + 3] = 0;//19-25
              UART1.pucSend_Buffer[2 * t + 3 + 1] = new_t[t];
            }

            CRC_H=(uint8_t) ((crc16(UART1.pucSend_Buffer,3+UART1.pucSend_Buffer[2])&0xFF00)>>8);
            CRC_L=(uint8_t) ((crc16(UART1.pucSend_Buffer,3+UART1.pucSend_Buffer[2])&0x00FF));
            UART1.pucSend_Buffer[3+UART1.pucSend_Buffer[2]]=CRC_H;
            UART1.pucSend_Buffer[4+UART1.pucSend_Buffer[2]]=CRC_L;
            Send_Data(UART1.pucSend_Buffer,5+UART1.pucSend_Buffer[2]);
        }
        else//寄存器数量超出范围
        {
            UART1.pucSend_Buffer[0]=0x03;
            UART1.pucSend_Buffer[1]=0x80 | UART1.pucRec_Buffer[1];
            UART1.pucSend_Buffer[2]=0x02;

            CRC_H=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0xFF00)>>8);
            CRC_L=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0x00FF));
            UART1.pucSend_Buffer[3]=CRC_H;
            UART1.pucSend_Buffer[4]=CRC_L;
          //  (*(UART1.pucSend_Buffer+3))=crc16(UART1.pucSend_Buffer,3);
            Send_Data(UART1.pucSend_Buffer,5);
        }
    }
    else//寄存器首地址不对
    {
        UART1.pucSend_Buffer[0]=0x03;
        UART1.pucSend_Buffer[1]=0x80 | UART1.pucRec_Buffer[1];
        UART1.pucSend_Buffer[2]=0x02;

        CRC_H=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0xFF00)>>8);
        CRC_L=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0x00FF));
        UART1.pucSend_Buffer[3]=CRC_H;
        UART1.pucSend_Buffer[4]=CRC_L;
      //  (*(UART1.pucSend_Buffer+3))=crc16(UART1.pucSend_Buffer,3);
        Send_Data(UART1.pucSend_Buffer,5);
    }

}


//Modbus 16功能码服务函数-----写多个字节
void Modbus_10_Solve(void)
{
    uint8_t t;

    if((UART1.pucRec_Buffer[2]==0x00)&&(UART1.pucRec_Buffer[3]>=0x14))//写入寄存器的首地址
    {
        if((UART1.pucRec_Buffer[4]==0x00)&&(UART1.pucRec_Buffer[5]<=0x22))//写入的寄存器个数，不能超过34个
        {
            //H桥节气门调节
            for(t=0; t<4; t++)
            {
              new_t[t] = UART1.pucRec_Buffer[6 + 2*t + 2];
              //PID_Control(&Motor[t].pid, Motor[t].PWM_Channel, t);
            }

            UART1.pucSend_Buffer[0]=0x01;
            UART1.pucSend_Buffer[1]=0x10;
            UART1.pucSend_Buffer[2]=UART1.pucRec_Buffer[2];
            UART1.pucSend_Buffer[3]=UART1.pucRec_Buffer[3];
            UART1.pucSend_Buffer[4]=UART1.pucRec_Buffer[4];
            UART1.pucSend_Buffer[5]=UART1.pucRec_Buffer[5];

            CRC_H=(uint8_t) ((crc16(UART1.pucSend_Buffer,6)&0xFF00)>>8);
            CRC_L=(uint8_t) ((crc16(UART1.pucSend_Buffer,6)&0x00FF));
            UART1.pucSend_Buffer[6]=CRC_H;
            UART1.pucSend_Buffer[7]=CRC_L;
          //  (*(UART1.pucSend_Buffer+6))=crc16(UART1.pucSend_Buffer,6);
            Send_Data(UART1.pucSend_Buffer,8);

        }
        else//寄存器个数超出范围
        {
            UART1.pucSend_Buffer[0]=0x03;
            UART1.pucSend_Buffer[1]=0x80 | UART1.pucRec_Buffer[1];
            UART1.pucSend_Buffer[2]=0x02;

            CRC_H=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0xFF00)>>8);
            CRC_L=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0x00FF));
            UART1.pucSend_Buffer[3]=CRC_H;
            UART1.pucSend_Buffer[4]=CRC_L;
           // (*(UART1.pucSend_Buffer+3))=crc16(UART1.pucSend_Buffer,3);
            Send_Data(UART1.pucSend_Buffer,5);
        }
    }
    else//首地址不对
    {
        UART1.pucSend_Buffer[0]=0x03;
        UART1.pucSend_Buffer[1]=0x80 | UART1.pucRec_Buffer[1];
        UART1.pucSend_Buffer[2]=0x02;

        CRC_H=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0xFF00)>>8);
        CRC_L=(uint8_t) ((crc16(UART1.pucSend_Buffer,3)&0x00FF));
        UART1.pucSend_Buffer[3]=CRC_H;
        UART1.pucSend_Buffer[4]=CRC_L;
      //  *(UART1.pucSend_Buffer+3)=crc16(UART1.pucSend_Buffer,3);
        Send_Data(UART1.pucSend_Buffer,5);
    }
}

